﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Entity;

namespace DAL.Persistencia
{
    public class MontaServicoDAL
    {

        private NewTierraEntities Con;

        public MontaServicoDAL()
        {
            Con = new NewTierraEntities();
        }

        public void Salvar(Monta_Servico m)
        {
            try
            {
                Con.AddToMonta_Servico(m);
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public Monta_Servico ObterPorId(int IdMonta)
        {
            try
            {
                return Con.Monta_Servico.Where(m => m.IdMServico == IdMonta).SingleOrDefault();
            }
            catch
            {
                throw;
            }
        }

        public void Excluir(Monta_Servico m)
        {
            try
            {
                Con.Monta_Servico.DeleteObject(m);
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public void Atualizar(Monta_Servico novo)
        {
            try
            {
                Monta_Servico antigo = ObterPorId(novo.IdMServico);

                antigo.MServico_Bulk_Porc_Taxa = novo.MServico_Bulk_Porc_Taxa;
                antigo.MServico_Bulk_Porc_Imposto = novo.MServico_Bulk_Porc_Imposto;
                antigo.MServico_Bulk_Porc_Comissao = novo.MServico_Bulk_Porc_Comissao;
                antigo.MServico_DataFrom = novo.MServico_DataFrom;
                antigo.MServico_DataTo = novo.MServico_DataTo;
                antigo.MServico_Obs = novo.MServico_Obs;
                antigo.S_id = novo.S_id;
                antigo.Tipo_Id = novo.Tipo_Id;
                antigo.Tipo_categ_id = novo.Tipo_categ_id;
                antigo.ItemSubServico_id = novo.ItemSubServico_id;
                antigo.SubItem_id = novo.SubItem_id;

                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public List<Monta_Servico> ListarTodos()
        {
            try
            {
                return Con.Monta_Servico.OrderBy(m => m.S_Servicos_Tipo.Tipo_Nome).ToList();
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMS(int IdSupplier)
        {
            try
            {
                return Con.Monta_Servico.Where(s => s.S_id == IdSupplier).Count() != 0;
            }
            catch
            {
                throw;
            }
        }

        public List<Servico_Completo> ListarTodosSubServicoPorTemporadaLista(int IdTemporada, int NumPaxs)
        {
            try
            {

                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico equals mon.IdMServico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join sba in Con.S_Bases on sup.S_id equals sba.S_id
                        join msv in Con.Monta_Servico_Valores on new { SID = (int)mon.IdMServico, BAS = (int)sba.Base_id } equals new { SID = (int)msv.IdMServico, BAS = (int)msv.Base_id }
                        where sco.IdMServico_Temporada == IdTemporada &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs
                        select sco).Distinct().ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosSubServicoPorTemporada(int IdTemporada, int NumPaxs)
        {
            try
            {

                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico equals mon.IdMServico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join sba in Con.S_Bases on sup.S_id equals sba.S_id
                        join msv in Con.Monta_Servico_Valores on new { SID = (int)mon.IdMServico, BAS = (int)sba.Base_id } equals new { SID = (int)msv.IdMServico, BAS = (int)msv.Base_id }
                        where sco.IdMServico_Temporada == IdTemporada &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs
                        select new
                        {
                            sup.S_nome,
                            sba.Base_de,
                            sba.Base_ate,
                            msv.MServico_Valores_Bulk_Total
                        }).Distinct().ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfersSubServico(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, int IdServico)
        {
            try
            {
                if (IdServico > 0)
                {
                    return (from sco in Con.Servico_Completo
                            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                            join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                            join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                            join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                            join spp in Con.Suppliers on mon.S_id equals spp.S_id
                            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                            where mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      sco.SubServico == null &&
                                      sse.Servicos_transfer != null &&
                                      sse.Cid_Id == IdCidade &&
                                      mon.S_id == IdSupplier &&
                                      sse.Servicos_Id == IdServico
                            select new
                            {
                                mon.IdMServico,
                                sse.Servicos_Nome,
                                sse.Recommended,
                                sbv.S_Bases_Valor_valor,
                                sba.Base_de,
                                sba.Base_ate,
                                sco.IdMServico_Temporada,
                                spp.S_id,
                                spp.S_nome,
                                mod.Moeda_id,
                                mod.Moeda_sigla,
                                mon.MServico_DataFrom,
                                mon.MServico_DataTo
                            }).Distinct().ToList();
                }
                else
                    if (IdSupplier > 0)
                    {
                        return (from sco in Con.Servico_Completo
                                join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                                join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                                join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                                join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                                join spp in Con.Suppliers on mon.S_id equals spp.S_id
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataTo &&
                                          mon.MServico_DataTo >= DataFrom &&
                                          sba.Base_de <= NumPaxs &&
                                          sba.Base_ate >= NumPaxs &&
                                          sco.SubServico == null &&
                                          sse.Servicos_transfer != null &&
                                          sse.Cid_Id == IdCidade &&
                                          mon.S_id == IdSupplier
                                select new
                                {
                                    mon.IdMServico,
                                    sse.Servicos_Nome,
                                    sse.Recommended,
                                    sbv.S_Bases_Valor_valor,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sco.IdMServico_Temporada,
                                    spp.S_id,
                                    spp.S_nome,
                                    mod.Moeda_id,
                                    mod.Moeda_sigla,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo
                                }).Distinct().ToList();
                    }
                    else
                    {
                        return (from sco in Con.Servico_Completo
                                join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                                join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                                join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                                join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                                join spp in Con.Suppliers on mon.S_id equals spp.S_id
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataTo &&
                                          mon.MServico_DataTo >= DataFrom &&
                                          sba.Base_de <= NumPaxs &&
                                          sba.Base_ate >= NumPaxs &&
                                          sco.SubServico == null &&
                                          sse.Servicos_transfer != null &&
                                          sse.Cid_Id == IdCidade
                                select new
                                {
                                    mon.IdMServico,
                                    sse.Servicos_Nome,
                                    sse.Recommended,
                                    sbv.S_Bases_Valor_valor,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sco.IdMServico_Temporada,
                                    spp.S_id,
                                    spp.S_nome,
                                    mod.Moeda_id,
                                    mod.Moeda_sigla,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo
                                }).Distinct().ToList();
                    }
                //if (IdSupplier > 0)
                //{
                //    return (from sco in Con.Servico_Completo
                //            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                //            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                //            join sba in Con.S_Bases on sup.S_id equals sba.S_id
                //            join sev in Con.S_Servicos on sco.Servicos_Id equals sev.Servicos_Id
                //            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                //            join sbv in Con.S_Bases_Valor on sba.Base_id equals sbv.Base_id
                //            where mon.MServico_DataFrom <= DataFrom &&
                //                  mon.MServico_DataTo >= DataTo &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer != null &&
                //                  sev.Cid_Id == IdCidade &&
                //                  sup.S_id == IdSupplier
                //                  ||
                //                  mon.MServico_DataFrom <= DataTo &&
                //                  mon.MServico_DataTo >= DataFrom &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer != null &&
                //                  sev.Cid_Id == IdCidade &&
                //                  sup.S_id == IdSupplier
                //            select new
                //            {
                //                sup.S_id,
                //                sup.S_nome,
                //                sev.Servicos_Nome,
                //                mod.Moeda_sigla,
                //                sba.Base_de,
                //                sba.Base_ate,
                //                mon.MServico_DataFrom,
                //                mon.MServico_DataTo,
                //                mod.Moeda_id,
                //                sbv.S_Bases_Valor_valor,
                //                sco.IdMServico_Temporada
                //            }).Distinct().ToList();
                //}
                //else
                //{                    
                //    return (from sco in Con.Servico_Completo
                //            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                //            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                //            join sba in Con.S_Bases on sup.S_id equals sba.S_id
                //            join sev in Con.S_Servicos on sco.Servicos_Id equals sev.Servicos_Id
                //            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                //            join sbv in Con.S_Bases_Valor on sba.Base_id equals sbv.Base_id
                //            where mon.MServico_DataFrom <= DataFrom &&
                //                  mon.MServico_DataTo >= DataTo &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer != null &&
                //                  sev.Cid_Id == IdCidade
                //                  ||
                //                  mon.MServico_DataFrom <= DataTo &&
                //                  mon.MServico_DataTo >= DataFrom &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer != null &&
                //                  sev.Cid_Id == IdCidade
                //            select new
                //            {
                //                sup.S_id,
                //                sup.S_nome,
                //                sev.Servicos_Nome,
                //                mod.Moeda_sigla,
                //                sba.Base_de,
                //                sba.Base_ate,
                //                mon.MServico_DataFrom,
                //                mon.MServico_DataTo,
                //                mod.Moeda_id,
                //                sbv.S_Bases_Valor_valor,
                //                sco.IdMServico_Temporada
                //            }).Distinct().ToList();
                //}
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfersSubServico(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome)
        {
            try
            {

                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                        join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                        join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                        join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                        join spp in Con.Suppliers on mon.S_id equals spp.S_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  sco.SubServico == null &&
                                  sse.Servicos_transfer != null &&
                                  sse.Servicos_Nome.Equals(nome)
                        select new
                        {
                            mon.IdMServico,
                            sse.Servicos_Nome,
                            sbv.S_Bases_Valor_valor,
                            sba.Base_de,
                            sba.Base_ate,
                            sse.Recommended,
                            sco.IdMServico_Temporada,
                            spp.S_id,
                            spp.S_nome,
                            mod.Moeda_id,
                            mod.Moeda_sigla,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosToursSubServico(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, int IdServico)
        {
            try
            {
                if (IdServico > 0)
                {
                    return (from sco in Con.Servico_Completo
                            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                            join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                            join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                            join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                            join spp in Con.Suppliers on mon.S_id equals spp.S_id
                            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                            where mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      sco.SubServico == null &&
                                      sse.Servicos_transfer == null &&
                                      sse.Cid_Id == IdCidade &&
                                      mon.S_id == IdSupplier &&
                                      sse.Servicos_Id == IdServico
                            select new
                            {
                                mon.IdMServico,
                                sse.Servicos_Nome,
                                sse.Recommended,
                                sbv.S_Bases_Valor_valor,
                                sba.Base_de,
                                sba.Base_ate,
                                sco.IdMServico_Temporada,
                                spp.S_id,
                                spp.S_nome,
                                mod.Moeda_id,
                                mod.Moeda_sigla,
                                mon.MServico_DataFrom,
                                mon.MServico_DataTo
                            }).Distinct().ToList();
                }
                else
                    if (IdSupplier > 0)
                    {
                        return (from sco in Con.Servico_Completo
                                join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                                join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                                join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                                join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                                join spp in Con.Suppliers on mon.S_id equals spp.S_id
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataTo &&
                                          mon.MServico_DataTo >= DataFrom &&
                                          sba.Base_de <= NumPaxs &&
                                          sba.Base_ate >= NumPaxs &&
                                          sco.SubServico == null &&
                                          sse.Servicos_transfer == null &&
                                          sse.Cid_Id == IdCidade &&
                                          mon.S_id == IdSupplier
                                select new
                                {
                                    mon.IdMServico,
                                    sse.Servicos_Nome,
                                    sse.Recommended,
                                    sbv.S_Bases_Valor_valor,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sco.IdMServico_Temporada,
                                    spp.S_id,
                                    spp.S_nome,
                                    mod.Moeda_id,
                                    mod.Moeda_sigla,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo
                                }).Distinct().ToList();
                    }
                    else
                    {
                        return (from sco in Con.Servico_Completo
                                join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                                join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                                join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                                join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                                join spp in Con.Suppliers on mon.S_id equals spp.S_id
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataTo &&
                                          mon.MServico_DataTo >= DataFrom &&
                                          sba.Base_de <= NumPaxs &&
                                          sba.Base_ate >= NumPaxs &&
                                          sco.SubServico == null &&
                                          sse.Servicos_transfer == null &&
                                          sse.Cid_Id == IdCidade
                                select new
                                {
                                    mon.IdMServico,
                                    sse.Servicos_Nome,
                                    sse.Recommended,
                                    sbv.S_Bases_Valor_valor,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sco.IdMServico_Temporada,
                                    spp.S_id,
                                    spp.S_nome,
                                    mod.Moeda_id,
                                    mod.Moeda_sigla,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo
                                }).Distinct().ToList();
                    }

                //if (IdSupplier > 0)
                //{
                //    return (from sco in Con.Servico_Completo
                //            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                //            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                //            join sba in Con.S_Bases on sup.S_id equals sba.S_id
                //            join sev in Con.S_Servicos on sco.Servicos_Id equals sev.Servicos_Id
                //            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                //            join sbv in Con.S_Bases_Valor on sba.Base_id equals sbv.Base_id
                //            where mon.MServico_DataFrom <= DataFrom &&
                //                  mon.MServico_DataTo >= DataTo &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer == null &&
                //                  sev.Cid_Id == IdCidade &&
                //                  sup.S_id == IdSupplier
                //                  ||
                //                  mon.MServico_DataFrom <= DataTo &&
                //                  mon.MServico_DataTo >= DataFrom &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer == null &&
                //                  sev.Cid_Id == IdCidade &&
                //                  sup.S_id == IdSupplier
                //            select new
                //            {
                //                sup.S_id,
                //                sup.S_nome,
                //                sev.Servicos_Nome,
                //                mod.Moeda_sigla,
                //                sba.Base_de,
                //                sba.Base_ate,
                //                mon.MServico_DataFrom,
                //                mon.MServico_DataTo,
                //                mod.Moeda_id,
                //                sbv.S_Bases_Valor_valor,
                //                sco.IdMServico_Temporada
                //            }).Distinct().ToList();
                //}
                //else
                //{
                //    return (from sco in Con.Servico_Completo
                //            join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                //            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                //            join sba in Con.S_Bases on sup.S_id equals sba.S_id
                //            join sev in Con.S_Servicos on sco.Servicos_Id equals sev.Servicos_Id
                //            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                //            join sbv in Con.S_Bases_Valor on sba.Base_id equals sbv.Base_id
                //            where mon.MServico_DataFrom <= DataFrom &&
                //                  mon.MServico_DataTo >= DataTo &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer == null &&
                //                  sev.Cid_Id == IdCidade
                //                  ||
                //                  mon.MServico_DataFrom <= DataTo &&
                //                  mon.MServico_DataTo >= DataFrom &&
                //                  sba.Base_de <= NumPaxs &&
                //                  sba.Base_ate >= NumPaxs &&
                //                  sco.SubServico == null &&
                //                  sev.Servicos_transfer == null &&
                //                  sev.Cid_Id == IdCidade
                //            select new
                //            {
                //                sup.S_id,
                //                sup.S_nome,
                //                sev.Servicos_Nome,
                //                mod.Moeda_sigla,
                //                sba.Base_de,
                //                sba.Base_ate,
                //                mon.MServico_DataFrom,
                //                mon.MServico_DataTo,
                //                mod.Moeda_id,
                //                sbv.S_Bases_Valor_valor,
                //                sco.IdMServico_Temporada
                //            }).Distinct().ToList();
                //}

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosToursSubServico(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome)
        {
            try
            {
                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                        join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                        join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                        join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                        join spp in Con.Suppliers on mon.S_id equals spp.S_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  sco.SubServico == null &&
                                  sse.Servicos_transfer == null &&
                                  sse.Servicos_Nome.Equals(nome)
                        select new
                        {
                            mon.IdMServico,
                            sse.Servicos_Nome,
                            sbv.S_Bases_Valor_valor,
                            sse.Recommended,
                            sba.Base_de,
                            sba.Base_ate,
                            sco.IdMServico_Temporada,
                            spp.S_id,
                            spp.S_nome,
                            mod.Moeda_id,
                            mod.Moeda_sigla,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo
                        }).Distinct().ToList();


            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosToursSubServico(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome, int IdCidade)
        {
            try
            {
                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                        join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                        join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                        join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                        join spp in Con.Suppliers on mon.S_id equals spp.S_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  sco.SubServico == null &&
                                  sse.Servicos_transfer == null &&
                                  sse.Servicos_Nome.Equals(nome) &&
                                  sse.Cid_Id == IdCidade
                        select new
                        {
                            mon.IdMServico,
                            sse.Servicos_Nome,
                            sbv.S_Bases_Valor_valor,
                            sba.Base_de,
                            sba.Base_ate,
                            sco.IdMServico_Temporada,
                            spp.S_id,
                            spp.S_nome,
                            mod.Moeda_id,
                            mod.Moeda_sigla,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo
                        }).Distinct().ToList();


            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfers(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome, int IdCidade)
        {
            try
            {

                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              ssv.Servicos_transfer != null &&
                              ssv.Cid_Id == IdCidade &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null &&
                              ssv.Servicos_Nome.Equals(nome)
                        select new
                        {
                            ssv.Servicos_Nome,
                            sup.S_nome,
                            sup.S_id,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo,
                            mod.Moeda_sigla,
                            mod.Moeda_id,
                            msv.MServico_Valores_Bulk_Total,
                            sba.Base_de,
                            sba.Base_ate
                        }).ToList();
                //}

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfersSubServico(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome, int IdCidade)
        {
            try
            {

                return (from sco in Con.Servico_Completo
                        join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                        join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                        join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                        join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                        join spp in Con.Suppliers on mon.S_id equals spp.S_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  sco.SubServico == null &&
                                  sse.Servicos_transfer != null &&
                                  sse.Servicos_Nome.Equals(nome) &&
                                  sse.Cid_Id == IdCidade
                        select new
                        {
                            mon.IdMServico,
                            sse.Servicos_Nome,
                            sbv.S_Bases_Valor_valor,
                            sba.Base_de,
                            sba.Base_ate,
                            sco.IdMServico_Temporada,
                            spp.S_id,
                            spp.S_nome,
                            mod.Moeda_id,
                            mod.Moeda_sigla,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfers(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome)
        {
            try
            {               

                    return (from mon in Con.Monta_Servico
                            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                            join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                            join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                            join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                            join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                            where mon.MServico_DataFrom <= DataFrom &&
                                  mon.MServico_DataTo >= DataTo &&
                                  ssv.Servicos_transfer != null &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  scp.SubServico != null &&
                                  ssv.Servicos_Nome.Equals(nome)
                            select new
                            {
                                ssv.Servicos_Nome,
                                sup.S_nome,
                                sup.S_id,
                                ssv.Recommended,
                                mon.MServico_DataFrom,
                                mon.MServico_DataTo,
                                mod.Moeda_sigla,
                                mod.Moeda_id,
                                msv.MServico_Valores_Bulk_Total,
                                sba.Base_de,
                                sba.Base_ate
                            }).ToList();                
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTransfers(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, int IdServico)
        {
            try
            {

                if (IdServico > 0)
                {
                    return (from mon in Con.Monta_Servico
                            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                            join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                            join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                            join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                            join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                            where mon.MServico_DataFrom <= DataFrom &&
                                  mon.MServico_DataTo >= DataTo &&
                                  ssv.Servicos_transfer != null &&
                                  ssv.Cid_Id == IdCidade &&
                                  sup.S_id == IdSupplier &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  scp.SubServico != null &&
                                  ssv.Servicos_Id == IdServico
                                  ||
                                  mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  ssv.Servicos_transfer != null &&
                                  ssv.Cid_Id == IdCidade &&
                                  sup.S_id == IdSupplier &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  scp.SubServico != null &&
                                  ssv.Servicos_Id == IdServico
                            select new
                            {
                                ssv.Servicos_Nome,
                                sup.S_nome,
                                sup.S_id,
                                sup.Recomended,
                                mon.MServico_DataFrom,
                                mon.MServico_DataTo,
                                mod.Moeda_sigla,
                                mod.Moeda_id,
                                msv.MServico_Valores_Bulk_Total,
                                sba.Base_de,
                                sba.Base_ate
                            }).ToList();
                }
                else
                    if (IdSupplier > 0)
                    {
                        return (from mon in Con.Monta_Servico
                                join sup in Con.Suppliers on mon.S_id equals sup.S_id
                                join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                                join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                                join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                                join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataFrom &&
                                      mon.MServico_DataTo >= DataTo &&
                                      ssv.Servicos_transfer != null &&
                                      ssv.Cid_Id == IdCidade &&
                                      sup.S_id == IdSupplier &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                      ||
                                      mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      ssv.Servicos_transfer != null &&
                                      ssv.Cid_Id == IdCidade &&
                                      sup.S_id == IdSupplier &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                select new
                                {
                                    ssv.Servicos_Nome,
                                    sup.S_nome,
                                    sup.S_id,
                                    sup.Recomended,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo,
                                    mod.Moeda_sigla,
                                    mod.Moeda_id,
                                    msv.MServico_Valores_Bulk_Total,
                                    sba.Base_de,
                                    sba.Base_ate
                                }).ToList();
                    }
                    else
                    {
                        return (from mon in Con.Monta_Servico
                                join sup in Con.Suppliers on mon.S_id equals sup.S_id
                                join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                                join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                                join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                                join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                where mon.MServico_DataFrom <= DataFrom &&
                                      mon.MServico_DataTo >= DataTo &&
                                      ssv.Servicos_transfer != null &&
                                      ssv.Cid_Id == IdCidade &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                      ||
                                      mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      ssv.Servicos_transfer != null &&
                                      ssv.Cid_Id == IdCidade &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                select new
                                {
                                    ssv.Servicos_Nome,
                                    sup.S_nome,
                                    sup.S_id,
                                    sup.Recomended,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo,
                                    mod.Moeda_sigla,
                                    mod.Moeda_id,
                                    msv.MServico_Valores_Bulk_Total,
                                    sba.Base_de,
                                    sba.Base_ate
                                }).ToList();
                    }

            }
            catch
            {
                throw;
            }
        }

        public object ListarNomeTranfers(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs)
        {
            try
            {

                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              ssv.Servicos_transfer != null &&
                              ssv.Cid_Id == IdCidade &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null
                              ||
                              mon.MServico_DataFrom <= DataTo &&
                              mon.MServico_DataTo >= DataFrom &&
                              ssv.Servicos_transfer != null &&
                              ssv.Cid_Id == IdCidade &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null
                        select new
                        {
                            ssv.Servicos_Nome,
                            ssv.Servicos_Id
                        })
                        .Union
                        (from sco in Con.Servico_Completo
                         join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                         join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                         join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                         join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                         join spp in Con.Suppliers on mon.S_id equals spp.S_id
                         join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                         where mon.MServico_DataFrom <= DataTo &&
                                   mon.MServico_DataTo >= DataFrom &&
                                   sba.Base_de <= NumPaxs &&
                                   sba.Base_ate >= NumPaxs &&
                                   sco.SubServico == null &&
                                   sse.Servicos_transfer != null &&
                                   sse.Cid_Id == IdCidade &&
                                   mon.S_id == IdSupplier
                         select new
                         {
                             sse.Servicos_Nome,
                             sse.Servicos_Id
                         });

            }
            catch
            {
                throw;
            }
        }

        public object ListarNomeTranfersCidade(int IdCidade, DateTime dtfrom, DateTime dtto, int NumPaxs)
        {
            try
            {

                return ((from spp in Con.Suppliers
                         join sba in Con.S_Bases on spp.S_id equals sba.S_id
                         join mon in Con.Monta_Servico on spp.S_id equals mon.S_id
                         join sev in Con.Servico_Completo on mon.IdMServico equals sev.IdMServico
                         join sse in Con.S_Servicos on sev.Servicos_Id equals sse.Servicos_Id
                         where mon.MServico_DataFrom <= dtfrom &&
                               mon.MServico_DataTo >= dtto &&
                               sse.Servicos_transfer != null &&
                               sse.Cid_Id == IdCidade &&
                               sba.Base_de <= NumPaxs &&
                               sba.Base_ate >= NumPaxs &&
                               sev.SubServico != null
                         orderby sse.Servicos_Nome
                         select sse).Distinct().ToList())
                        .Union
                ((from spp in Con.Suppliers
                  join sba in Con.S_Bases on spp.S_id equals sba.S_id
                  join mon in Con.Monta_Servico on spp.S_id equals mon.S_id
                  join sev in Con.Servico_Completo on mon.IdMServico equals sev.IdMServico_Temporada
                  join sse in Con.S_Servicos on sev.Servicos_Id equals sse.Servicos_Id
                  where mon.MServico_DataFrom <= dtfrom &&
                        mon.MServico_DataTo >= dtto &&
                        sse.Cid_Id == IdCidade &&
                        sev.SubServico == null &&
                        sse.Servicos_transfer != null
                  orderby sse.Servicos_Nome
                  select sse).Distinct().ToList());
            }
            catch
            {
                throw;
            }
        }

        public object ListarNomeTours(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs)
        {
            try
            {

                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              ssv.Servicos_transfer == null &&
                              ssv.Cid_Id == IdCidade &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null
                              ||
                              mon.MServico_DataFrom <= DataTo &&
                              mon.MServico_DataTo >= DataFrom &&
                              ssv.Servicos_transfer == null &&
                              ssv.Cid_Id == IdCidade &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null
                        select new
                        {
                            ssv.Servicos_Nome,
                            ssv.Servicos_Id
                        })
                        .Union
                        (from sco in Con.Servico_Completo
                         join mon in Con.Monta_Servico on sco.IdMServico_Temporada equals mon.IdMServico
                         join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                         join sbv in Con.S_Bases_Valor on mon.IdMServico equals sbv.IdMServico
                         join sba in Con.S_Bases on sbv.Base_id equals sba.Base_id
                         join spp in Con.Suppliers on mon.S_id equals spp.S_id
                         join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                         where mon.MServico_DataFrom <= DataTo &&
                                   mon.MServico_DataTo >= DataFrom &&
                                   sba.Base_de <= NumPaxs &&
                                   sba.Base_ate >= NumPaxs &&
                                   sco.SubServico == null &&
                                   sse.Servicos_transfer == null &&
                                   sse.Cid_Id == IdCidade &&
                                   mon.S_id == IdSupplier
                         select new
                         {
                             sse.Servicos_Nome,
                             sse.Servicos_Id
                         });

            }
            catch
            {
                throw;
            }
        }

        public object ListarNomeToursCidade(int IdCidade, DateTime dtfrom, DateTime dtto, int NumPaxs)
        {
            try
            {

                return ((from spp in Con.Suppliers
                         join sba in Con.S_Bases on spp.S_id equals sba.S_id
                         join mon in Con.Monta_Servico on spp.S_id equals mon.S_id
                         join sev in Con.Servico_Completo on mon.IdMServico equals sev.IdMServico
                         join sse in Con.S_Servicos on sev.Servicos_Id equals sse.Servicos_Id
                         where mon.MServico_DataFrom <= dtfrom &&
                               mon.MServico_DataTo >= dtto &&
                               sse.Servicos_transfer == null &&
                               sse.Cid_Id == IdCidade &&
                               sba.Base_de <= NumPaxs &&
                               sba.Base_ate >= NumPaxs &&
                               sev.SubServico != null
                         orderby sse.Servicos_Nome
                         select sse).Distinct().ToList())
                        .Union
                ((from spp in Con.Suppliers
                  join sba in Con.S_Bases on spp.S_id equals sba.S_id
                  join mon in Con.Monta_Servico on spp.S_id equals mon.S_id
                  join sev in Con.Servico_Completo on mon.IdMServico equals sev.IdMServico_Temporada
                  join sse in Con.S_Servicos on sev.Servicos_Id equals sse.Servicos_Id
                  where mon.MServico_DataFrom <= dtfrom &&
                        mon.MServico_DataTo >= dtto &&
                        sse.Cid_Id == IdCidade &&
                        sev.SubServico == null &&
                        sse.Servicos_transfer == null
                  orderby sse.Servicos_Nome
                  select sse).Distinct().ToList());

            }
            catch
            {
                throw;
            }
        }

        public Monta_Servico_Valores ObterValorTransfers(DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, string nomeServ)
        {
            try
            {

                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on msv.Base_id equals sba.Base_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              ssv.Servicos_Nome.Equals(nomeServ) &&
                              scp.SubServico != null
                              ||
                              mon.MServico_DataFrom <= DataTo &&
                              mon.MServico_DataTo >= DataFrom &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              ssv.Servicos_Nome.Equals(nomeServ) &&
                              scp.SubServico != null
                        select msv).SingleOrDefault();

            }
            catch
            {
                throw;
            }
        }

        public Monta_Servico_Valores ObterValorTransfers(DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, string nomeServ, int IdCidade)
        {
            try
            {

                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on msv.Base_id equals sba.Base_id
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              ssv.Servicos_Nome.Equals(nomeServ) &&
                              scp.SubServico != null &&
                              ssv.Cid_Id == IdCidade
                              ||
                              mon.MServico_DataFrom <= DataTo &&
                              mon.MServico_DataTo >= DataFrom &&
                              sup.S_id == IdSupplier &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              ssv.Servicos_Nome.Equals(nomeServ) &&
                              scp.SubServico != null &&
                              ssv.Cid_Id == IdCidade
                        select msv).Distinct().SingleOrDefault();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTours(int IdCidade, DateTime DataFrom, DateTime DataTo, int IdSupplier, int NumPaxs, int IdServico)
        {
            try
            {
                if (IdServico > 0)
                {
                    return (from mon in Con.Monta_Servico
                            join sup in Con.Suppliers on mon.S_id equals sup.S_id
                            join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                            join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                            join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                            join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                            join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                            join sst in Con.S_Servicos_Tipo on mon.Tipo_Id equals sst.Tipo_Id
                            join stg in Con.S_Servicos_Tipo_Categ on mon.Tipo_categ_id equals stg.Tipo_categ_id
                            where mon.MServico_DataFrom <= DataFrom &&
                                  mon.MServico_DataTo >= DataTo &&
                                  ssv.Cid_Id == IdCidade &&
                                  sup.S_id == IdSupplier &&
                                  ssv.Servicos_transfer == null &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  scp.SubServico != null &&
                                  ssv.Servicos_Id == IdServico
                                  ||
                                  mon.MServico_DataFrom <= DataTo &&
                                  mon.MServico_DataTo >= DataFrom &&
                                  ssv.Cid_Id == IdCidade &&
                                  sup.S_id == IdSupplier &&
                                  ssv.Servicos_transfer == null &&
                                  sba.Base_de <= NumPaxs &&
                                  sba.Base_ate >= NumPaxs &&
                                  scp.SubServico != null &&
                                  ssv.Servicos_Id == IdServico
                            select new
                            {
                                ssv.Servicos_Nome,
                                sup.S_nome,
                                sup.Recomended,
                                sup.S_id,
                                mon.MServico_DataFrom,
                                mon.MServico_DataTo,
                                mod.Moeda_sigla,
                                mod.Moeda_id,
                                msv.MServico_Valores_Bulk_Total,
                                sba.Base_de,
                                sba.Base_ate,
                                sst.Tipo_Nome,
                                stg.Tipo_categ_nome

                            }).ToList();
                }
                else
                    if (IdSupplier > 0)
                    {
                        return (from mon in Con.Monta_Servico
                                join sup in Con.Suppliers on mon.S_id equals sup.S_id
                                join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                                join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                                join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                                join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                join sst in Con.S_Servicos_Tipo on mon.Tipo_Id equals sst.Tipo_Id
                                join stg in Con.S_Servicos_Tipo_Categ on mon.Tipo_categ_id equals stg.Tipo_categ_id
                                where mon.MServico_DataFrom <= DataFrom &&
                                      mon.MServico_DataTo >= DataTo &&
                                      ssv.Cid_Id == IdCidade &&
                                      sup.S_id == IdSupplier &&
                                      ssv.Servicos_transfer == null &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                      ||
                                      mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      ssv.Cid_Id == IdCidade &&
                                      sup.S_id == IdSupplier &&
                                      ssv.Servicos_transfer == null &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                select new
                                {
                                    ssv.Servicos_Nome,
                                    sup.S_nome,
                                    sup.S_id,
                                    sup.Recomended,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo,
                                    mod.Moeda_sigla,
                                    mod.Moeda_id,
                                    msv.MServico_Valores_Bulk_Total,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sst.Tipo_Nome,
                                    stg.Tipo_categ_nome

                                }).ToList();
                    }
                    else
                    {
                        return (from mon in Con.Monta_Servico
                                join sup in Con.Suppliers on mon.S_id equals sup.S_id
                                join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                                join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                                join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                                join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                                join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                                join sst in Con.S_Servicos_Tipo on mon.Tipo_Id equals sst.Tipo_Id
                                join stg in Con.S_Servicos_Tipo_Categ on mon.Tipo_categ_id equals stg.Tipo_categ_id
                                where mon.MServico_DataFrom <= DataFrom &&
                                      mon.MServico_DataTo >= DataTo &&
                                      ssv.Cid_Id == IdCidade &&
                                      ssv.Servicos_transfer == null &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                      ||
                                      mon.MServico_DataFrom <= DataTo &&
                                      mon.MServico_DataTo >= DataFrom &&
                                      ssv.Servicos_transfer == null &&
                                      ssv.Cid_Id == IdCidade &&
                                      sba.Base_de <= NumPaxs &&
                                      sba.Base_ate >= NumPaxs &&
                                      scp.SubServico != null
                                select new
                                {
                                    ssv.Servicos_Nome,
                                    sup.S_nome,
                                    sup.S_id,
                                    sup.Recomended,
                                    mon.MServico_DataFrom,
                                    mon.MServico_DataTo,
                                    mod.Moeda_sigla,
                                    mod.Moeda_id,
                                    msv.MServico_Valores_Bulk_Total,
                                    sba.Base_de,
                                    sba.Base_ate,
                                    sst.Tipo_Nome,
                                    stg.Tipo_categ_nome
                                }).ToList();
                    }

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTours(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome, int IdCidade)
        {
            try
            {
                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        join sst in Con.S_Servicos_Tipo on mon.Tipo_Id equals sst.Tipo_Id
                        join stg in Con.S_Servicos_Tipo_Categ on mon.Tipo_categ_id equals stg.Tipo_categ_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              ssv.Servicos_transfer == null &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null &&
                              ssv.Servicos_Nome.Equals(nome) &&
                              ssv.Cid_Id == IdCidade
                        select new
                        {
                            ssv.Servicos_Nome,
                            sup.S_nome,
                            sup.S_id,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo,
                            mod.Moeda_sigla,
                            mod.Moeda_id,
                            msv.MServico_Valores_Bulk_Total,
                            sba.Base_de,
                            sba.Base_ate,
                            sst.Tipo_Nome,
                            stg.Tipo_categ_nome
                        }).ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosTours(DateTime DataFrom, DateTime DataTo, int NumPaxs, string nome)
        {
            try
            {
                return (from mon in Con.Monta_Servico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        join scp in Con.Servico_Completo on mon.IdMServico equals scp.IdMServico
                        join ssv in Con.S_Servicos on scp.Servicos_Id equals ssv.Servicos_Id
                        join msv in Con.Monta_Servico_Valores on mon.IdMServico equals msv.IdMServico
                        join sba in Con.S_Bases on new { SID = (int)sup.S_id, BAS = (int)msv.Base_id } equals new { SID = (int)sba.S_id, BAS = (int)sba.Base_id }
                        join mod in Con.Moeda on sba.Moeda_id equals mod.Moeda_id
                        join sst in Con.S_Servicos_Tipo on mon.Tipo_Id equals sst.Tipo_Id
                        join stg in Con.S_Servicos_Tipo_Categ on mon.Tipo_categ_id equals stg.Tipo_categ_id
                        where mon.MServico_DataFrom <= DataFrom &&
                              mon.MServico_DataTo >= DataTo &&
                              ssv.Servicos_transfer == null &&
                              sba.Base_de <= NumPaxs &&
                              sba.Base_ate >= NumPaxs &&
                              scp.SubServico != null &&
                              ssv.Servicos_Nome.Equals(nome)
                        select new
                        {
                            ssv.Servicos_Nome,
                            sup.S_nome,
                            sup.S_id,
                            ssv.Recommended,
                            mon.MServico_DataFrom,
                            mon.MServico_DataTo,
                            mod.Moeda_sigla,
                            mod.Moeda_id,
                            msv.MServico_Valores_Bulk_Total,
                            sba.Base_de,
                            sba.Base_ate,
                            sst.Tipo_Nome,
                            stg.Tipo_categ_nome
                        }).ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(int IdSupplier)
        {
            try
            {
                //return Con.Monta_Servico.Where(m => m.S_id == IdSupplier).ToList();

                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier
                        select new
                        {
                            ms.IdMServico,
                            ms.MServico_Obs,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            st.Tipo_categ_nome,
                            ss.Tipo_Nome,
                            tt.TipoTrans_nome,
                            S_nome = ms.Supplier.S_nome,
                            S_telefone = ms.Supplier.S_telefone,
                            S_email = ms.Supplier.S_email
                            //bs.Base_id
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosSubServico(int IdSupplier)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        where ms.S_id == IdSupplier &&
                              ms.Tipo_categ_id == null
                        select new
                        {
                            ms.IdMServico,
                            ms.MServico_Obs,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            ss.Tipo_Nome,
                            S_nome = ms.Supplier.S_nome,
                            S_telefone = ms.Supplier.S_telefone,
                            S_email = ms.Supplier.S_email
                            //bs.Base_id
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosSubServicoSub(int IdSupplier)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        where ms.S_id == IdSupplier &&
                              ms.Tipo_categ_id == null
                        select new
                        {
                            ms.IdMServico,
                            ms.MServico_Obs,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            S_nome = ms.Supplier.S_nome,
                            S_telefone = ms.Supplier.S_telefone,
                            S_email = ms.Supplier.S_email
                            //bs.Base_id
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosSubServicoSub(int IdSupplier, int IdServico)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join sc in Con.Servico_Completo on ms.IdMServico equals sc.IdMServico_Temporada
                        where ms.Tipo_categ_id == null &&
                              ms.S_id == IdSupplier &&
                              sc.Servicos_Id == IdServico
                        select new
                        {
                            ms.IdMServico,
                            ms.MServico_Obs,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            S_nome = ms.Supplier.S_nome,
                            S_telefone = ms.Supplier.S_telefone,
                            S_email = ms.Supplier.S_email

                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMServico(int IdSupplier, DateTime From, DateTime To)
        {
            try
            {
                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        join mo in Con.Moeda on bs.Moeda_id equals mo.Moeda_id
                        where ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= From &&
                              ms.MServico_DataTo >= To
                              ||
                              ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= To &&
                              ms.MServico_DataTo >= From
                        select new
                         {
                             ms.MServico_DataFrom,
                             ms.MServico_DataTo,
                             st.Tipo_categ_nome,
                             ms.MServico_Obs,
                             ms.IdMServico,
                             mo.Moeda_sigla
                         }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMServicoSub(int IdSupplier, DateTime From, DateTime To)
        {
            try
            {
                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        join mo in Con.Moeda on bs.Moeda_id equals mo.Moeda_id
                        where ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= From &&
                              ms.MServico_DataTo >= To
                              ||
                              ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= To &&
                              ms.MServico_DataTo >= From
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            ms.MServico_Obs,
                            ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                            SubItem = ms.SubItem.SubItem_nome,
                            ms.IdMServico,
                            mo.Moeda_sigla,
                            bs.Base_index
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMServicoSub(int IdSupplier, DateTime From, DateTime To, int IndexBase)
        {
            try
            {
                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        join mo in Con.Moeda on bs.Moeda_id equals mo.Moeda_id
                        where ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= From &&
                              ms.MServico_DataTo >= To &&
                              bs.Base_index == IndexBase
                              ||
                              ms.S_id == IdSupplier &&
                              ms.MServico_DataFrom <= To &&
                              ms.MServico_DataTo >= From &&
                              bs.Base_index == IndexBase
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            ms.MServico_Obs,
                            ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                            SubItem = ms.SubItem.SubItem_nome,
                            ms.IdMServico,
                            mo.Moeda_sigla,
                            bs.Base_index
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoPorServico(int IdServico)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join sc in Con.Servico_Completo on ms.IdMServico equals sc.IdMServico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        join su in Con.Suppliers on ms.S_id equals su.S_id
                        where sc.Servicos_Id == IdServico &&
                        sc.SubServico == false
                        select new
                        {
                            su.S_nome,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoPorSubServico(int IdServico)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join sc in Con.Servico_Completo on ms.IdMServico equals sc.IdMServico_Temporada
                        where sc.Servicos_Id == IdServico &&
                              sc.SubServico == null
                        select new
                        {
                            ms.Supplier.S_nome,
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo
                        }).Distinct().ToList();


            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMServico(int IdSupplier, int IdServico)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join sc in Con.Servico_Completo on ms.IdMServico equals sc.IdMServico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier &&
                              sc.Servicos_Id == IdServico
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            st.Tipo_categ_nome,
                            ms.MServico_Obs,
                            ms.IdMServico,
                            bs.Mercado.Mercado_nome,
                            bs.Mercado_id,
                            bs.BaseTarifaria_id,
                            bs.TipoBase_id,
                            bs.Moeda_id
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMServico(int IdSupplier)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join sc in Con.Servico_Completo on ms.IdMServico equals sc.IdMServico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            st.Tipo_categ_nome,
                            ms.MServico_Obs,
                            ms.IdMServico
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMS(int IdSupplier)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            st.Tipo_categ_nome,
                            ms.MServico_Obs,
                            ms.IdMServico
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMSCustos(int IdSupplier)
        {
            try
            {

                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier
                        select new
                        {
                            ms.MServico_DataFrom,
                            ms.MServico_DataTo,
                            ms.MServico_Obs,
                            ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                            SubItem = ms.SubItem.SubItem_nome,
                            ms.IdMServico,
                            bs.Base_index
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosCondicaoMSCustos(int IdSupplier, DateTime From, DateTime To, int IdItemSubServico, int IdSubItem, int IndexBase)
        {
            try
            {

                var query = (from ms in Con.Monta_Servico
                             join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                             join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                             join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                             where ms.S_id == IdSupplier
                             where ms.MServico_DataFrom <= (From) &&
                                   ms.MServico_DataTo >= (To) &&
                                   ms.ItemSubServico_id == IdItemSubServico &&
                                   ms.SubItem_id == IdSubItem &&
                                   bs.Base_index == IndexBase
                                   ||
                                   ms.MServico_DataFrom <= (To) &&
                                   ms.MServico_DataTo >= (From) &&
                                   ms.ItemSubServico_id == IdItemSubServico &&
                                   ms.SubItem_id == IdSubItem &&
                                   bs.Base_index == IndexBase
                             select new
                             {
                                 ms.MServico_DataFrom,
                                 ms.MServico_DataTo,
                                 ms.MServico_Obs,
                                 ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                                 SubItem = ms.SubItem.SubItem_nome,
                                 ms.IdMServico,
                                 bs.Base_index
                             }).Distinct().ToList();

                var query2 = (from ms in Con.Monta_Servico
                              join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                              join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                              join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                              where ms.S_id == IdSupplier
                              where ms.MServico_DataFrom <= (From) &&
                                    ms.MServico_DataTo >= (To) &&
                                    ms.ItemSubServico_id == IdItemSubServico &&
                                    bs.Base_index == IndexBase
                                    ||
                                    ms.MServico_DataFrom <= (To) &&
                                    ms.MServico_DataTo >= (From) &&
                                    ms.ItemSubServico_id == IdItemSubServico &&
                                    bs.Base_index == IndexBase
                              select new
                              {
                                  ms.MServico_DataFrom,
                                  ms.MServico_DataTo,
                                  ms.MServico_Obs,
                                  ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                                  SubItem = ms.SubItem.SubItem_nome,
                                  ms.IdMServico,
                                  bs.Base_index
                              }).Distinct().ToList();

                var query3 = (from ms in Con.Monta_Servico
                              join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                              join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                              join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                              where ms.S_id == IdSupplier
                              where ms.MServico_DataFrom <= (From) &&
                                    ms.MServico_DataTo >= (To) &&
                                    ms.SubItem_id == IdSubItem &&
                                    bs.Base_index == IndexBase
                                    ||
                                    ms.MServico_DataFrom <= (To) &&
                                    ms.MServico_DataTo >= (From) &&
                                    ms.SubItem_id == IdSubItem &&
                                    bs.Base_index == IndexBase
                              select new
                              {
                                  ms.MServico_DataFrom,
                                  ms.MServico_DataTo,
                                  ms.MServico_Obs,
                                  ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                                  SubItem = ms.SubItem.SubItem_nome,
                                  ms.IdMServico,
                                  bs.Base_index
                              }).Distinct().ToList();

                var query4 = (from ms in Con.Monta_Servico
                              join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                              join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                              join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                              where ms.S_id == IdSupplier
                              where ms.MServico_DataFrom <= (From) &&
                                    ms.MServico_DataTo >= (To) &&
                                   bs.Base_index == IndexBase
                                    ||
                                    ms.MServico_DataFrom <= (To) &&
                                    ms.MServico_DataTo >= (From) &&
                                   bs.Base_index == IndexBase
                              select new
                              {
                                  ms.MServico_DataFrom,
                                  ms.MServico_DataTo,
                                  ms.MServico_Obs,
                                  ItemSubServico = ms.ItemSubServico.ItemSubServico_nome,
                                  SubItem = ms.SubItem.SubItem_nome,
                                  ms.IdMServico,
                                  bs.Base_index
                              }).Distinct().ToList();


                if (IdItemSubServico > 0 && IdSubItem > 0)
                {
                    return query;
                }
                else if (IdItemSubServico > 0 && IdSubItem == 0)
                {
                    return query2;
                }
                else if (IdItemSubServico == 0 && IdSubItem > 0)
                {
                    return query3;
                }
                else
                {
                    return query4;
                }

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosComBase(int IdSupplier)
        {
            try
            {
                //return Con.Monta_Servico.Where(m => m.S_id == IdSupplier).ToList();

                return (from ms in Con.Monta_Servico
                        join mv in Con.Monta_Servico_Valores on ms.IdMServico equals mv.IdMServico
                        join bs in Con.S_Bases on mv.Base_id equals bs.Base_id
                        join st in Con.S_Servicos_Tipo_Categ on ms.Tipo_categ_id equals st.Tipo_categ_id
                        join ss in Con.S_Servicos_Tipo on ms.Tipo_Id equals ss.Tipo_Id
                        join tt in Con.Tipo_Transporte on bs.IdTipoTrans equals tt.IdTipoTrans
                        where ms.S_id == IdSupplier
                        select new
                        {
                            ms.IdMServico,
                            ms.MServico_Obs,
                            st.Tipo_categ_nome,
                            ss.Tipo_Nome,
                            tt.TipoTrans_nome,
                            S_nome = ms.Supplier.S_nome,
                            S_telefone = ms.Supplier.S_telefone,
                            S_email = ms.Supplier.S_email
                            //mv.MServico_Valores_Bulk_Total,
                            //bs.Base_de,
                            //bs.Base_ate,
                            //bs.Base_id
                        }).Distinct().ToList();

            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMS(int IdSupplier, int IdTipo, int IdTipoCateg)
        {
            try
            {
                return Con.Monta_Servico.Where(m => m.S_id == IdSupplier
                                                && m.Tipo_Id == IdTipo
                                                && m.Tipo_categ_id == IdTipoCateg).Count() != 0;
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMSCustos(int IdSupplier, int IdItemSubServ, int IdSubItem)
        {
            try
            {
                return Con.Monta_Servico.Where(m => m.S_id == IdSupplier
                                                && m.ItemSubServico_id == IdItemSubServ
                                                && m.SubItem_id == IdSubItem).Count() != 0;
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMS(int IdSupplier, int IdServico)
        {
            try
            {
                return (from sc in Con.Servico_Completo
                        join ms in Con.Monta_Servico on sc.IdMServico equals ms.IdMServico
                        where ms.S_id == IdSupplier &&
                              sc.Servicos_Id == IdServico &&
                              sc.SubServico == false
                        select sc).Count() != 0;
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosOb()
        {
            try
            {

                var query = (from ms in Con.Monta_Servico
                             join st in Con.S_Servicos_Tipo on ms.Tipo_Id equals st.Tipo_Id
                             join sc in Con.S_Servicos_Tipo_Categ on st.Tipo_Id equals sc.Tipo_Id
                             select new
                             {
                                 ms.IdMServico,
                                 ms.MServico_Bulk_Porc_Taxa,
                                 ms.MServico_Bulk_Porc_Imposto,
                                 ms.MServico_Bulk_Porc_Comissao,
                                 ms.MServico_PorPessoa,
                                 ms.MServico_DataFrom,
                                 ms.MServico_DataTo,
                                 ms.MServico_Obs,
                                 st.Tipo_Nome,
                                 sc.Tipo_categ_nome

                             }).ToList().OrderBy(m => m.Tipo_categ_nome);

                return query;

            }
            catch
            {
                throw;
            }
        }

        public int QtdMServico(int IdSupplier, int index)
        {
            try
            {
                return (from ms in Con.Monta_Servico
                        join sb in Con.S_Bases on ms.S_id equals sb.S_id
                        where ms.S_id == IdSupplier
                           && sb.Base_index == index
                        select ms).Count();
            }
            catch
            {
                throw;
            }
        }

        public Array ListarTodosSubServicoPorTemporadaArray(int IdTemporada, int NumPaxs)
        {
            try
            {

                var query = (from sco in Con.Servico_Completo
                             join mon in Con.Monta_Servico on sco.IdMServico equals mon.IdMServico
                             join sup in Con.Suppliers on mon.S_id equals sup.S_id
                             join sba in Con.S_Bases on sup.S_id equals sba.S_id
                             join msv in Con.Monta_Servico_Valores on new { SID = (int)mon.IdMServico, BAS = (int)sba.Base_id } equals new { SID = (int)msv.IdMServico, BAS = (int)msv.Base_id }
                             join its in Con.ItemSubServico on mon.ItemSubServico_id equals its.ItemSubServico_id
                             join sbi in Con.SubItem on mon.SubItem_id equals sbi.SubItem_id
                             where sco.IdMServico_Temporada == IdTemporada &&
                                   sba.Base_de <= NumPaxs &&
                                   sba.Base_ate >= NumPaxs &&
                                   sco.ServicoCompleto_de <= NumPaxs &&
                                   sco.ServicoCompleto_ate >= NumPaxs
                             select new
                             {
                                 sup.S_nome,
                                 sba.Base_de,
                                 sba.Base_ate,
                                 msv.MServico_Valores_Bulk_Total,
                                 its.ItemSubServico_nome,
                                 sbi.SubItem_nome,
                                 sba.Moeda_id,
                                 sba.Moeda.Moeda_nome,
                                 sba.TipoBase_id
                             }).Distinct().ToList();


                return query.ToArray();
            }
            catch
            {
                throw;
            }
        }      

    }
}
